package com.atguigu.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

public class JdbcUtils {
    private static DataSource dds;
    private static ThreadLocal<Connection> conns=new ThreadLocal<Connection>();
    static {
        try {
            Properties p=new Properties();
            //读取jdbc.properties属性配置文件
            //InputStream is = ClassLoader.getSystemResourceAsStream("jdbc.properties");
            InputStream is =JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
            //从流中加载数据
            p.load(is);
            //创建数据库连接池
            dds= DruidDataSourceFactory.createDataSource(p);
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 获取数据库连接池中的连接(返回null就是获取连接失败)
     * @return
     */
    public static Connection getConnection(){
//        Connection conn = null;
//        try {
//            conn = dds.getConnection();
//        } catch (SQLException throwables) {
//            throwables.printStackTrace();
//        }
        Connection conn =conns.get();
        if(conn==null){
            try {
                conn= dds.getConnection();//从数据库连接池中获取连接
                conns.set(conn);//保存到ThreadLocal对象中，供后面的jdbc操作使用
                conn.setAutoCommit(false);//设置为手动管理
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }

        return conn;
    }
//    /**
//     * 关闭数据库连接
//     */
//    public static void closeConnection(Connection conn){
//        if (conn!=null){
//            try {
//                conn.close();
//            } catch (SQLException throwables) {
//                throwables.printStackTrace();
//            }
//        }
//    }

    /**
     * 提交事务，并关闭释放连接
     */
    public static void commitAndCloseConnection(){
        Connection conn = conns.get();
        if(conn!=null){//如果不等于null，说明之前使用过连接，操作过数据库
            try {
                conn.commit();//提交事务
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }finally {
                try {
                    conn.close();//关闭连接，释放资源
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
        conns.remove();
        //一定要执行此操作，否则会出错【因为Tomcat服务器底层使用了线程池技术】
    }
    /**
     * 回滚事务，并关闭释放连接
     */
    public static void rollbackAndCloseConnection(){
        Connection conn = conns.get();
        if(conn!=null){//如果不等于null，说明之前使用过连接，操作过数据库
            try {
                conn.rollback();//回滚事务
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }finally {
                try {
                    conn.close();//关闭连接，释放资源
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
        conns.remove();
        //一定要执行此操作，否则会出错【因为Tomcat服务器底层使用了线程池技术】
    }
}
